;; HECHOS INICIALES.

   
						 
(deffacts data					(portatil (marca DELL) (familia Mini) (precio 190) (pantalla 10.1) (peso 1.3) (ram 1) (disco 160 ) (tarjetaGrafica Integrada)(memGrafica 256) (procesador IntelAtom) (velocidad 2.4)(cores 1) (duracionBateria 3) (so Ubuntu_8.04) (garantia 0) (nombre  Mini_10))
                        			(portatil (marca DELL) (familia Inspiron) (precio 608) (pantalla 15.6) (peso 2.6) (ram 3) (disco 250) (tarjetaGrafica Integrada)(memGrafica 256) (procesador IntelCorei5) (velocidad 2.4) (cores 4) (duracionBateria 4) (so Windows7_64bits) (garantia 15)(nombre  Inspiron_15))
						(portatil (marca DELL) (familia Studio) (precio 649) (pantalla 17.3) (peso 3.6) (ram 4) (disco 500) (tarjetaGrafica ATIRadeon5650)(memGrafica 256) (procesador IntelCorei5) (velocidad 2.4) (cores 4) (duracionBateria 3) (so Windows7_64bits) (garantia 15)(nombre  Studio_17))
						(portatil (marca DELL) (familia Alienware) (precio 1806) (pantalla 15.6) (peso 3.6) (ram 6) (disco 320) (tarjetaGrafica NVIDIAGeForceGTX) (procesador IntelCorei7)  (velocidad 2.4)(cores 4) (duracionBateria 3) (so Windows7_64bits) (garantia 0)(nombre  Alienware_M15))
						(portatil (marca DELL) (familia Andamo) (precio 1978) (pantalla 13.4) (peso 1.8) (ram 4) (disco 256) (tarjetaGrafica Integrada)(memGrafica 256) (procesador IntelCoreDuo) (velocidad 2.4) (cores 2) (duracionBateria 5) (so Windows7_64bits) (garantia 0)(nombre  Andamo_Pearl_Desire))
						(portatil (marca DELL) (familia Inspiron) (precio 468) (pantalla 11.6) (peso 1.4) (ram 2) (disco 250) (tarjetaGrafica Integrada)(memGrafica 256) (procesador IntelULVSU)  (velocidad 2.4)(cores 2) (duracionBateria 4) (so Windows7_64bits) (garantia 15)(nombre  Inspiron_11z))
						(portatil (marca DELL) (familia Studio) (precio 1028) (pantalla 15.6) (peso 2.9) (ram 4) (disco 500) (tarjetaGrafica ATIRadeon4670)(memGrafica 256) (procesador IntelCorei7)  (velocidad 2.4)(cores 4) (duracionBateria 3) (so Windows7_64bits) (garantia 0)(nombre  Studio_XPS))
						(portatil (marca DELL) (familia Alienware) (precio 999) (pantalla 11.6) (peso 1.9) (ram 4) (disco 250) (tarjetaGrafica GeForceGT335)(memGrafica 256) (procesador IntelCoreDuo) (velocidad 2.4) (cores 2) (duracionBateria 5) (so Windows7_64bits) (garantia 0)(nombre  Alienware_M11x))
						(portatil (marca DELL) (familia Inspiron) (precio 499) (pantalla 15.6) (peso 2.7) (ram 2) (disco 500) (tarjetaGrafica ATIRadeon4330)(memGrafica 256) (procesador AMD_AthlonX2)  (velocidad 2.4)(cores 2) (duracionBateria 3) (so Windows7_64bits) (garantia 0)(nombre  Inspiron_1546))
						(portatil (marca DELL) (familia Mini) (precio 199) (pantalla 10.1) (peso 1.3) (ram 1) (disco 8) (tarjetaGrafica Integrada)(memGrafica 256) (procesador IntelAtom)  (velocidad 2.4)(cores 1) (duracionBateria 3) (so Ubuntu_8.04) (garantia 0)(nombre  Mini10v))

						)


;; Preguntas al cliente.

;; Men� seleccion tipo de b�squeda 

;; 1. Busqueda por marca.
;; 2. Busqueda por uso.
;; 3. Busqueda por caracter�sticas.


(defrule seleccion-busqueda
   

(fase seleccion-tipo-busqueda)
  

 =>
 ( printout t "-----------------------------------------------------------------" crlf )
 ( printout t "-----Bienvenido al asistente de compra para portatiles Dell------" crlf )
 ( printout t "1. Busqueda por marca." crlf )
 ( printout t "2. Busqueda por uso." crlf )
 ( printout t "3. Busqueda por caracteristicas." crlf )
 ( printout t "-----------------------------------------------------------------" crlf )
 ( assert (busqueda-por (read) )) )

;; Si elecci�n de opci�n incorrecta volvemos al men�.

(defrule mala-seleccion-busqueda

  ?fase <- (fase seleccion-tipo-busqueda)
  ?eleccion <- (busqueda-por ?valor)
  (test (or (not(integerp ?valor))
	(< ?valor 1)
	(> ?valor 3) 
	 ) ) 

=>
 
 (retract ?fase ?eleccion)
 (assert (fase seleccion-tipo-busqueda))
 (printout t "Opcion invalida." crlf ) )


;; Si la elecci�n es buena.

(defrule buena-eleccion-busqueda

 ?fase <- (fase seleccion-tipo-busqueda)
 ?eleccion <-(busqueda-por ?valor)
 (test (and  (integerp ?valor)
	      (> ?valor 0)
	      (< ?valor 4)   ) )

=>

  (retract ?fase ?eleccion)
  (assert (busqueda-por ?valor) )  )


 ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;;

;;Concatenacion de busquedas

(defrule menu-final
?fase <- (fase-final 1)
 =>
 ( printout t "-----------------------------------------------------------------" crlf )
 ( printout t "-----Que desea hacer ahora?------" crlf )
 ( printout t "1. Agnadir un nuevo parametro a mi busqueda." crlf )
 ( printout t "2. Iniciar una busqueda nueva." crlf )
 ( printout t "3. Mostrar resultados." crlf )
 ( printout t "-----------------------------------------------------------------" crlf )


(assert (final (read)) ) )

  
;; Mala seleccion final

(defrule mala-seleccion-final

  ?fase <- (fase-final)

  ?eleccion <- (final ?cuanto)
  
  (test (or (not(integerp ?cuanto))
	(< ?cuanto 1)
	(> ?cuanto 5) 
	) ) 

=>
 
 (retract ?fase ?eleccion )
 (assert (fase-final) )
 (printout t "Opcion invalida." crlf) )

;; Buena seleccion final

(defrule buena-seleccion-final

  ?fase <- (fase-final)
  ?eleccion <- (final ?cuanto)
   (test (and (integerp ?cuanto)
	(> ?cuanto 0)
	(< ?cuanto 6) 
	) ) 
=>

 (retract ?fase ?eleccion)
 (assert (final ?cuanto))
  )


(defrule final1
?fin <- (final 1)
=>
(assert(fase seleccion-tipo-busqueda))
(retract ?fin)
)

(defrule final2
?fin <- (final 2)
=>
(retract ?fin)
(reset)
)

(defrule uno-final
?fin <- (final 3)
=>
(mostrar_todo )
(retract ?fin )
)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Preguntar marcas

(defrule seleccion-marca

   (busqueda-por 1)

=> 
 ( printout t "--------------Busqueda por marca---------------------" crlf )
 
 ( printout t "---Seleccione la marca deseada----" crlf )
 ( printout t "1. Mini ." crlf )
 ( printout t "2. Inspiron " crlf )
 ( printout t "3. Studio " crlf )
 ( printout t "4. AlienWare ." crlf)
 ( printout t "5. Andamo." crlf)
 (assert (marca (read)) ) )

  
;; Mala seleccion de marca

(defrule mala-seleccion-marca

  ?fase <- (busqueda-por 1)

  ?eleccion <- (marca ?cuanto)
  
  (test (or (not(integerp ?cuanto))
	(< ?cuanto 1)
	(> ?cuanto 5) 
	) ) 

=>
 
 (retract ?fase ?eleccion )
 (assert (busqueda-por 1) )
 (printout t "Opcion invalida." crlf) )

;; Buena seleccion de marca

(defrule buena-seleccion-marca

  ?fase <- (busqueda-por 1)
  ?eleccion <- (marca ?cuanto)
   (test (and (integerp ?cuanto)
	(> ?cuanto 0)
	(< ?cuanto 6) 
	) ) 
=>

 (retract ?fase)
  )
 ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;;
 ;; Busqueda por uso
 
 (defrule select-uso
   (busqueda-por 2)
  =>
 ( printout t "--------------Busqueda por uso---------------------" crlf )
 ( printout t "---Seleccione el uso que va a utilizar----" crlf )
 ( printout t "1. Videojuegos" crlf )
 ( printout t "2. Ofimatica" crlf )
 ( printout t "3. Programaci�n" crlf )
 ( printout t "4. Simulaci�n." crlf)
 ( printout t "5. Internet." crlf)
 ( printout t "6. Sustituto de Mesa" crlf)
 ( printout t "7. Trabajo en distintos lugares" crlf)
 ( assert (uso (read)) ) )
 
 ;; Mala b�squeda uso
   
 (defrule mala-seleccion-uso

  ?fase <- (busqueda-por 2)
  ?eleccion <- (uso ?cuanto)
  
  (test (or (not(integerp ?cuanto))
	(< ?cuanto 1)
	(> ?cuanto 7) 
	) ) 

=>
 
 (retract ?fase ?eleccion )
 (assert (busqueda-por 2) )
 (printout t "Opcion invalida." crlf) )
 
 ;; Buena b�squeda uso
 
 (defrule buena-seleccion-uso

  ?fase <- (busqueda-por 2)
  ?eleccion <- (uso ?cuanto)
   (test (and (integerp ?cuanto)
	(> ?cuanto 0)
	(< ?cuanto 8) 
	) ) 

=>	
   (retract ?fase ?eleccion)
   (assert (mostrar uso ?cuanto)))
 
 ;; Busqueda espec�fica
 
 (defrule busqueda-por-caracteristicas
 
  ?fase <- (busqueda-por 3)
  
  =>
   
   ( printout t "--------------Seleccione la caracter�stica que desea fijar---------------------" crlf )
   ( printout t "1.Precio" crlf)   
   ( printout t "2.Tamagno Pantalla" crlf)  
   ( printout t "3.Peso" crlf)  
   ( printout t "4.RAM" crlf)  
   ( printout t "5.Procesador" crlf)  
   ( printout t "6.Tarjeta Memoria" crlf)  
   ( printout t "7.Disco duro" crlf)  
   ( printout t "8.Pantalla tactil" crlf)  
   ( printout t "9.Bateria" crlf)
   ( printout t "10.Sistema Operativo" crlf)
   ( assert (opcion (read) ) )
   )  

;; Mala seleccion b�squeda especifica

(defrule mala-busqueda-por-caracteristicas 
   ?fase <- (busqueda-por 3)
   ?opcion <- (opcion ?cuanto)
   (test (or (not(integerp ?cuanto))
	(< ?cuanto 1)
	(> ?cuanto 10) 
	) ) 

=>

   (retract ?fase ?opcion)
   (assert (busqueda-por 3) )
   (printout t "Error, opcion invalida" crlf)  )

;; Mala seleccion b�squeda especifica

 (defrule buena-busqueda-por-caracteristicas 
   ?fase <- (busqueda-por 3)
   ?opcion <- (opcion ?cuanto)
   (test (and (integerp ?cuanto)
	(>= ?cuanto 1)
	(< ?cuanto 11) 
	) ) 

=>

   (retract ?fase ?opcion)
   (assert (mostrar ?cuanto ))
   )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   

;;-------------------------------------------USOS-----------------------------------------------------------------
;;Caracteristica 1.

(defrule mostrar-precios

   ?fase <- (mostrar 1)
   
=>

   (printout t "Seleccione el rango de precios deseados" crlf)
   (printout t "1.Menos de 250" crlf)
   (printout t "2.Entre  250 y 400" crlf)
   (printout t "3.Entre  400 y 750" crlf)
   (printout t "4.Entre  750 y 1000" crlf)
   (printout t "5.Entre  1000 y 1400" crlf)
   (printout t "6.Mas de 1400" crlf)
   (retract ?fase)
   (assert (rango-precio (read))) )
   
;;Caracteristica 2.

(defrule mostrar-tama�o-pantalla
   
?fase <- (mostrar 2)
   
=>

   (printout t "Seleccione el tama�o de pantalla deseado" crlf)
   (printout t "1.26 cm (10,1'') " crlf)
   (printout t "2.29 cm (11,6'')" crlf)
   (printout t "3.33,8 cm (13,3'') - 34 cm (13,4'')" crlf)
   (printout t "4.39 cm (15,4'') - 41 cm (16'')" crlf)
   (printout t "5.43 cm (17'') - 44 cm (17,'') " crlf)
   (retract ?fase)
   (assert (tamagno-pantalla (read))) )
     
;;Caracteristica 3

(defrule mostrar-peso
  ?fase <- (mostrar 3)
  
=> 
   (printout t "Seleccione el peso deseado" crlf)
   (printout t "1.Ligero " crlf)
   (printout t "2.Normal" crlf)
   (printout t "3.Sustituto de Mesa" crlf)
   (retract ?fase)
   (assert (peso (read))) )

;;Caracteristica 4
   
(defrule mostrar-RAM

 ?fase <- (mostrar 4)
 
 =>
   (printout t "Seleccione la RAM deseada" crlf)
   (printout t "1. 1gb " crlf)
   (printout t "2. 2-3gb" crlf)
   (printout t "3. 4gb" crlf)
   (printout t "4. 6gb" crlf)
   (retract ?fase)
   (assert (ram (read))) )
   
;; Caracteristica 5

(defrule mostrar-Procesador
 
  ?fase <- (mostrar 5)
  =>
    (printout t "Seleccione el procesador deseado" crlf)
   (printout t "1.Intel atom " crlf)
   (printout t "2.Intel core i5" crlf)
   (printout t "3.Intel core i7" crlf)
   (printout t "3.Intel ULV SU4100" crlf)
   (printout t "4.Intel core duo" crlf)
    (retract ?fase)
	(assert (procesador (read))))

;;Caracteristica 6

(defrule mostrar-tarjeta-video
?fase <- (mostrar 6)
=>
  (printout t "Seleccione la tarjeta de video deseada" crlf)
   (printout t "1.integradas " crlf)
   (printout t "2.ATI Mobility HD 5650 (1GB)" crlf)
   (printout t "3.NVIDIA GeForce GTX 260M (1GB)" crlf)
   (printout t "4.ATI Radeon HD 4670 (1GB )" crlf)
   (retract ?fase)
   (assert (video (read))))
   
;;Caracteristica 7

(defrule mostrar-disco-duro
?fase <- (mostrar 7)
=>
  (printout t "Seleccione el disco duro deseado" crlf)
  (printout t "1.M�s de 500 GB: 9.250 horas de m�sica o 750 horas de v�deo " crlf)
  (printout t "2.M�s de 320 GB: 5.900 horas de m�sica o 500 horas de v�deo" crlf)
  (printout t "3.M�s de 160 GB: 3.000 horas de m�sica o 250 horas de v�deo" crlf)
  (printout t "4.Quiero una unidad de estado solido " crlf)
  (retract ?fase)
  (assert (disco(read))))

;;Caracteristica 8

(defrule mostrar-pantalla-tactil
?fase <- (mostrar 8)
=>
  (printout t "Seleccione si desea pantalla tactil" crlf)
  (printout t "Introduzca 'si', si desea la pantalla tactil" crlf)
  (printout t "Introduzca 'no', si no desea pantalla tactil" crlf)
  (retract ?fase)
  (assert (tactil (read))))

;;Caracteristica 9

(defrule mostrar-bateria
?fase <- (mostrar 9)

=>
  (printout t "Seleccione la duracion de la bateria" crlf)
  (printout t "1. Baja" crlf)
  (printout t "2. Media" crlf)
  (printout t "3. Alta" crlf)
  (retract ?fase)
  (assert (bateria (read))))
  
  
 ;;Caracteristica 10
 
 (defrule mostrar-so
 ?fase <- (mostrar 10)
 =>
  (printout t "Seleccione el sistema operativo" crlf)
  (printout t "1. Ubuntu" crlf)
  (printout t "2. Windows 7 32 bit" crlf)
  (printout t "3. Windows 7 64 bit" crlf)
  (retract ?fase)
  (assert (so (read))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     (defquery dame-portatiles 
	"Selecciona portatiles por precio"
	
    
     ?pc <-(portatil ) )


 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;SEGUN EL CARACTERÍTICA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defrule precio-1
 ?rango <- (rango-precio ?min ?max)
 =>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if (or (< ?p.precio ?min) (> ?p.precio ?max)) then
  	(retract ?p)))
  	(retract ?rango)
)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defrule pantalla-1'
  ?tamagno <- (tamagno-pantalla ?min ?max)
  =>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.pantalla ?min) (> ?p.pantalla ?max)) then
   (retract ?p )
   ))
   (retract ?tamagno)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;NO ESTA METIDO
(defrule peso-1
 ?peso <- (peso ?min ?max)
 =>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.peso ?min) (> ?p.peso ?max)) then
   (retract ?p )
   ))
   (retract ?peso)
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (defrule ram-1
 ?ram <- (ram ?min ?max)
 =>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.ram ?min) (> ?p.ram ?max)) then
   (retract ?p )
   ))
   (retract ?ram)
)
 

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;NO SE USA
 (defrule procesador-1
	?proc <- (procesador ?modelo)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.procesador   ?modelo) then
   (retract ?p )
   ))
   (retract ?proc)
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defrule vprocesador-2
	?proc <- (velocidad ?min ?max)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.velocidad ?min) (> ?p.velocidad ?max)) then
   (retract ?p )
   ))
   (retract ?proc)
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 (defrule disco-1
	?disco <- (disco ?min ?max)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.disco ?min) (> ?p.disco ?max)) then
   (retract ?p )
   ))
   (retract ?disco)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 (defrule garantia-1
	?garantia <- (garantia ?min)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (< ?p.garantia ?min) then
   (retract ?p )
   ))
   (retract ?garantia)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defrule grafica-1
	?graf <- (video ?min ?max)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.memGrafica ?min) (> ?p.memGrafica ?max)) then
   (retract ?p )
   ))
   (retract ?graf)
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defrule so-1
	?so <- (so ?sistema)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.so ?sistema) then
   (retract ?p )
   ))
   (retract ?so)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
(defrule bateria-1
	?bat <- (bateria ?min ?max)
	=>
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if  (or (< ?p.duracionBateria ?min) (> ?p.duracionBateria ?max)) then
   (retract ?p )
   ))
  (retract ?bat)
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;SEGUN EL FAMILIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 (defrule marca-Mini
   ?marca <- (marca 1)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.familia Mini) then
   (retract ?p )
   ))
   (retract ?marca)
   (assert (fase-final)))
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
(defrule marca-Inspiron
   ?marca <- (marca 2)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.familia Inspiron) then
   (retract ?p )
   ))
   (retract ?marca)
   (assert (fase-final)))  
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 (defrule marca-Studio
   ?marca <- (marca 3)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.familia Studio) then
   (retract ?p )
   ))
   (retract ?marca)(facts)
   (assert (fase-final)))  
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 (defrule marca-Alienware
   ?marca <- (marca 4)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.familia AlienWare) then
   (retract ?p )
   ))
   (retract ?marca)
   (assert (fase-final)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 (defrule marca-Andamo
   ?marca <- (marca 5)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (<> ?p.familia Andamo) then
   (retract ?p )
   ))
   (retract ?marca)
   (assert (fase-final)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;SEGUN EL USO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (defrule uso-Videojuegos
   ?uso<- (mostrar uso 1)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (not(eq ?p.familia Alienware)) then
    (retract  ?p )
	)
   )

  (retract ?uso)
  (assert (fase-final)) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (defrule uso-Ofimatica
   ?uso<- (mostrar uso 2)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (or (> ?p.precio 750) (< ?p.pantalla 15.6)) then ;; OFIMATICA => SI PRECIO MENOR QUE 750 , PAntalla Grande y extras Word??
    (retract  ?p )
	)
   )

  (retract ?uso)
  (assert (fase-final)) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (defrule uso-Programacion
   ?uso<- (mostrar uso 3)
   => 
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (or (< ?p.ram 4) (or(< ?p.pantalla 15.6) (< ?p.cores 4) )) then ;; PROGRAMACION => SI RAM >= 4, PANTALLA MAYOR= 15.6 y 4 Cores.
    (retract  ?p )
	)
   )

  (retract ?uso)
  (assert (fase-final)) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (defrule uso-Simulacion
   ?uso<- (mostrar uso 4)
   => 
  
  (bind ?re (run-query* dame-portatiles ))
  (facts)
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (or (< ?p.ram 4) (and (<> ?p.procesador IntelCoreDuo)     (<> ?p.procesador IntelCorei7))  ) then ;; SIMULACION => SI RAM >= 6,  y 4 cores procesador .
    (retract  ?p )
	)
   )

  (retract ?uso)
  (assert (fase-final)) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   (defrule uso-Internet
   ?uso<- (mostrar uso 5)
   => 
  
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (or (>= ?p.peso 3.0) (or(< ?p.duracionBateria 4) (>= ?p.precio 750)))  then ;; Internet => SI Menor que MEdio, Barteria Media-Alta, precio menor que 750.
    (retract  ?p )
	)
   )
  
   (retract ?uso)
  (assert (fase-final)) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     (defrule uso-SustitutoMesa
   ?uso<- (mostrar uso 6)
   => 
  
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (or (< ?p.ram 4) (or (and (<> ?p.procesador IntelCorei7) (<> ?p.procesador IntelCoreDuo)) (or (not(<> ?p.tarjetaGrafica Integrada))(<= ?p.peso 2.5))))  then ;; SustitutoMesa => Buen ram, Buena Tarjeta Gr�fica,buen procesador, Peso alto.
    (retract  ?p )
	)
   )
  (mostrar_todo )
  (retract ?uso)
  (assert (fase-final)) )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defrule uso-TrabajoDistintosSitios
   ?uso<- (mostrar uso 7)
   => 
  
  (bind ?re (run-query* dame-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject pc))
  (if   (or (> ?p.peso 1.5) (or (< ?p.duracionBateria 3) (> ?p.pantalla 11.6)) )  then ;; movilidad  => Peso Ligero, Pantalla peuque�a, bateria decente.
    (retract  ?p )
	)
   )
  
  (retract ?uso)
  (assert (fase-final)) )
 

(defquery obtener-portatiles2
"Devuelve todos los PC's que hay en la BC"
?port<-(portatil)
)




(reset)
(run)
